﻿using System;
using System.IO;
using System.Windows.Forms;
using CRC.Incidencias.Dominio.Controladores;
using System.Collections.Generic;
using System.Drawing;
using CRC.Comun.Presentacion;
using System.ComponentModel;

namespace CRC.Incidencias.Presentacion
{
    public partial class FotosIncidencias : UsrExploradorFotos
    {
        private ControladorGestionFotosIncidencia cGFI = new ControladorGestionFotosIncidencia();
        private const int intCatIncidencias = 1;
        private UsrThumbnail miniaturaActual = null;

        public FotosIncidencias() : base()
        {
            InitializeComponent();

            butNuevaCateg.Enabled = false;
            butElimCateg.Enabled = false;
            listView1.Enabled = false;

        }

        public FotosIncidencias(int pIntIncidencia) : this()
        {
            btnCerrar.Visible = true;
            mostrarCargando(true);
            listarFotos.RunWorkerAsync(pIntIncidencia);
        }

        protected override void subirFoto(String pStrArchivo)
        {
            btnSubirFoto.Enabled = false;
            añadirMiniatura();
            subirImagen.RunWorkerAsync(
                new Object[] { pStrArchivo, txtComentario.Text.Trim() }
            );
        }

        private void añadirMiniatura(
                int pIntId,
                Image pFot,
                String pStrNombre,
                String pStrCom,
                int pIntTamEnKB)
        {
            UsrThumbnail miniatura = new UsrThumbnail(pIntId, pFot, pStrNombre, pStrCom, pIntTamEnKB);
            panelMiniaturas.Controls.Add(miniatura);
            miniatura.evEliminarFoto += new UsrThumbnail.eliminarFoto(miniatura_evEliminarFoto);
            miniatura.evSeleccionarFoto += new UsrThumbnail.seleccionarFoto(miniatura_evSeleccionarFoto);
            miniatura.evVerFoto += new UsrThumbnail.verFoto(miniatura_evVerFoto);
        }

        protected void añadirMiniatura()
        {
            UsrThumbnail miniatura = new UsrThumbnail();
            panelMiniaturas.Controls.Add(miniatura);
            miniatura.evEliminarFoto += new UsrThumbnail.eliminarFoto(miniatura_evEliminarFoto);
            miniatura.evSeleccionarFoto += new UsrThumbnail.seleccionarFoto(miniatura_evSeleccionarFoto);
            miniatura.evVerFoto += new UsrThumbnail.verFoto(miniatura_evVerFoto);
        }

        protected void quitarMiniatura(UsrThumbnail pMini)
        {
            this.panelMiniaturas.Controls.Remove(pMini);
            this.txtComentario.Text = String.Empty;
        }

        #region " Miniatura "

                void miniatura_evVerFoto(Object sender, int pIntId)
                {
                    miniaturaActual = (UsrThumbnail)sender;
                    miniaturaActual.cargandoImagen = true;
                    cargandoFoto.RunWorkerAsync( pIntId );
                }

                void miniatura_evSeleccionarFoto(Object sender, String pInformacion)
                {
                    UsrThumbnail mini = (UsrThumbnail)sender;
                    foreach (Control c in panelMiniaturas.Controls)
                    {
                        if (c != sender)
                            c.BackColor = Color.White;
                        else 
                        {
                            if (c.BackColor.Equals(Color.FromKnownColor(KnownColor.Control)))
                                c.BackColor = Color.White;
                            else 
                                c.BackColor = Color.FromKnownColor(KnownColor.Control);
                        }
                    }

                    lblSize.Text = "Tamaño: " + mini.TamañoEnKB + " KB";
                    txtComentario.Text = pInformacion;
                }

                void miniatura_evEliminarFoto(Object sender, int pIntId)
                {
                    try
                    {
                        cGFI.eliminarFoto(pIntId);
                        quitarMiniatura((UsrThumbnail)sender);
                    }
                    catch (Exception ex) 
                    {
                        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                
        #endregion

        #region " Listar fotos (backgroundworker)"

            void listarFotos_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
            {

                mostrarCargando(false);
                btnSubirFoto.Enabled = true;

                if (e.Error == null)
                {
                    IList<Object[]> infoFotos = (IList<Object[]>)e.Result;
                    foreach (Object[] infFot in infoFotos)
                        añadirMiniatura(
                            (int)infFot[0],
                            (Image)infFot[2],
                            (String)infFot[1],
                            (String)infFot[3],
                            (int)infFot[4]
                        );
                }
                else
                {
                    try
                    {
                        throw e.Error;
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }

            }

            void listarFotos_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
            {
                try
                {
                    int intInc = (int)e.Argument;
                    e.Result = cGFI.listarFotos(intInc); ;
                }
                catch (Exception ex)
                {
                    e.Cancel = true;
                    throw ex;
                }
            }

        #endregion

        #region " Subir Foto "

                void subirImagen_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
                {

                    lblCargandoFotos.Visible = true;
                    btnSubirFoto.Enabled = true;

                    if (e.Error == null)
                    {
                        Object[] res = (Object[])e.Result;

                        UsrThumbnail miniatura = (UsrThumbnail)panelMiniaturas.Controls[panelMiniaturas.Controls.Count - 1];
                        miniatura.PonerImagen((int)res[0], (Image)res[1], (String)res[2], (String)res[3], (int)res[4]);
                    }
                    else
                    {
                        //Quitar miniatura
                        panelMiniaturas.Controls.Remove(panelMiniaturas.Controls[panelMiniaturas.Controls.Count - 1]);

                        try
                        {
                            throw e.Error;
                        }
                        catch (FileNotFoundException fNFEx)
                        {
                            MessageBox.Show("No se pudo encontrar la imagen :\n" + fNFEx.FileName,
                                "Imagen no encontrada", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

                        }
                        catch (IOException ioEx)
                        {
                            MessageBox.Show("Error con el archivo.\n" + ioEx.Message,
                                "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.Message, "Error",
                                MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                }

                void subirImagen_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
                {
                    try
                    {
                        Object[] parametros = (Object[])e.Argument;
                        e.Result = cGFI.nuevaFoto((String)parametros[0], (String)parametros[1]);
                    }
                    catch (Exception ex)
                    {
                        e.Cancel = true; 
                        throw ex;
                    }
                }

            #endregion

        #region " Cargando foto (BackgroundWorker) "

                private void cargandoFoto_DoWork(object sender, DoWorkEventArgs e)
                {
                    try
                    {
                        e.Result = cGFI.verFoto((int)e.Argument);
                    }
                    catch (Exception ex)
                    {
                        e.Cancel=true;
                        throw ex;
                    }
                }

                void cargandoFoto_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
                {
                    miniaturaActual.cargandoImagen = false;

                    if (e.Error == null)
                    {
                        verFoto((Image)e.Result, miniaturaActual.NombreImagen, miniaturaActual.Comentarios);
                    }
                    else
                    {
                        try
                        {
                            throw e.Error;
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.Message, "Error",
                                MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                }

                private void verFoto(Image pFoto, String pStrNombre, String pStrCom)
                {
                    VerFoto verFoto = new VerFoto(pFoto, pStrNombre, pStrCom);
                    verFoto.StartPosition = FormStartPosition.CenterScreen;
                    verFoto.ShowDialog();
                }

                #endregion
    }
}
